package com.itheima.d8_stream;

import java.util.*;
import java.util.stream.Stream;

/**
 * 目标：掌握Stream流的创建。
 *
 * public interface Stream<T> …{  }
 *
 * 先找到数据源，一般是数组或者集合
 * 然后通过数据源获取Stream流
 * Stream流代表一条流水线，并能与数据源建立连接
 * 调用流水线的各种方法对数据进行处理、计算。
 * 获取处理的结果，遍历、统计、收集到一个新集合中返回
 *
 * 1、Stream是什么？有什么作用？ 结合了什么技术？
 * 简化集合、数组操作的API。结合了Lambda表达式。
 *
 * 2、说说Stream流处理数据的步骤是什么？
 * 先得到集合或者数组的Stream流。
 * 然后调用Stream流的方法对数据进行处理。
 * 获取处理的结果。
 *
 *  获取集合的Stream流，Collection提供的如下方法
 * default Stream<E> stream()    获取当前集合对象的Stream流
 *
 * 获取 数组 的Stream流
 * Arrays类提供的如下方法:  public static <T> Stream<T> stream(T[] array)    获取当前数组的Stream流
 * Stream类提供的如下方法:  public static<T> Stream<T> of(T... values)       获取当前接收数据的Stream流
 *
 *
 */
public class StreamTest2 {
    public static void main(String[] args) {
        // 1、如何获取List集合的Stream流？
        List<String> names = new ArrayList<>();
        Collections.addAll(names, "张三丰","张无忌","周芷若","赵敏","张强");
        Stream<String> stream = names.stream();
        names.stream().filter(a->a.length()>2).forEach(System.out::println);
        System.out.println("-------");
        stream.filter(b->b.startsWith("赵")).forEach(s-> System.out.println(s));

        System.out.println("----------");
        // 2、如何获取Set集合的Stream流？
        Set<String> set = new HashSet<>();
        Collections.addAll(set, "刘德华","张曼玉","蜘蛛精","马德","德玛西亚");
        Stream<String> stream1 = set.stream();
        stream1.filter(s -> s.contains("德")).forEach(s -> System.out.println(s));   //先设置条件过滤，然后遍历

        System.out.println("------------获取Map集合的Stream流----------");

        // 3、如何获取Map集合的Stream流？ map集合不属于collection，所以不能直接调用stream流
        Map<String, Double> map = new HashMap<>();
        map.put("古力娜扎", 172.3);
        map.put("迪丽热巴", 168.3);
        map.put("马尔扎哈", 166.3);
        map.put("卡尔扎巴", 168.3);
        //单独得到map里面键，放在set集合里面，就可以得到键的stream流
        Set<String> keys = map.keySet();
        Stream<String> ks = keys.stream();
        //单独得到map里面值，放在collection集合里面，就可以得到值的stream流
        Collection<Double> values = map.values();
        Stream<Double> vs = values.stream();

        System.out.println("--------自己试一试----------");
        Set<String> z1 = map.keySet();
        Stream<String> z11 = z1.stream();
        z1.stream().filter(a->a.startsWith("迪")).forEach(s-> System.out.println(s));

        System.out.println("-----------------把map集合看做一个整体处理stream流---------------------");
        //如果要把map集合看做一个整体处理stream流，用entrySet方法把map集合的每一个键值对看做一个整体的数据类型，然后放在set集合里面
        Set<Map.Entry<String, Double>> entries = map.entrySet();
        Stream<Map.Entry<String, Double>> kvs = entries.stream();
        kvs.filter(e -> e.getKey().contains("巴"))
                .forEach(e -> System.out.println(e.getKey()+ "-->" + e.getValue()));

        System.out.println("--------自己试一试把map的键值对看成entry对象处理stream流----------");
        Set<Map.Entry<String,Double>> zeng = map.entrySet();
        Stream<Map.Entry<String,Double>> zeng1 = zeng.stream();
        zeng1.filter(s->s.getKey().contains("扎")).forEach(s-> System.out.println(s.getValue()));


        // 4、如何获取数组的Stream流？
        String[] names2 = {"张翠山", "东方不败", "唐大山", "独孤求败"};
        Stream<String> s1 = Arrays.stream(names2);
        Stream<String> s2 = Stream.of(names2);
        s1.filter(a->a.length()>3).forEach(s -> System.out.println(s));
    }
}
